#define  _CRT_SECURE_NO_WARNINGS 1
#include"SingleList.h"

ListNode* BuyListNode(DataType x)
{
	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
	assert(newnode);
	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}
void ListPrint(ListNode* L)
{
	ListNode* cur = L;
	while (cur)
	{
		printf("%d", cur->data);
		cur = cur->next;
	}
	printf("\n");
}
void ListPushBack(ListNode** L, DataType x)
{
	assert(*L);
	ListNode* newnode = BuyListNode(x);
	if (*L == NULL)
	{
		*L = newnode;
	}
	else
	{
		ListNode* tail = *L;
		while (tail->next)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}
void ListPushFront(ListNode** L, DataType x)
{
	assert(L);
	ListNode* newnode = BuyListNode(x);
	newnode->next = *L;
	*L = newnode;
}
void ListPopBack(ListNode** L)
{
	assert(L);
	if ((*L)->next == NULL)
	{
		free(*L);
		*L = NULL;
	}
	else
	{
		ListNode* tail = *L;
		while (tail->next->next)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}
void ListPopBack(ListNode** L)
{
	assert(L);
	if ((*L)->next == NULL)
	{
		free(*L);
		*L = NULL;
	}
	else
	{
		ListNode* tail = *L;
		ListNode* prev = NULL;
		while (tail->next)
		{
			prev = tail;
			tail = tail->next;
		}
		prev->next = NULL;
		free(tail);
	}
}
void ListPopFront(ListNode** L)
{
	assert(L);
	assert(*L);
	ListNode* prev = (*L)->next;
	free(*L);
	*L = prev;
}
ListNode* ListFind(ListNode* L,DataType x)
{
	ListNode* cur = L;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
	}
	return NULL;
}
void ListInsert(ListNode** L, ListNode* pos, DataType x)
{
	assert(pos);
	assert(L);
	if (*L == pos)
	{
		ListPushFront(L, x);
	}
	else
	{
		ListNode* 
	}
}
void ListInsert(ListNode** L, ListNode* pos, DataType x)
{
	assert(L);
	assert(pos);
	if (pos == *L)
	{
		ListPushFront(L, x);
	}
	else
	{
		ListNode* prev = *L;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		ListNode* newnode = BuyListNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}
void ListErase(ListNode** L, ListNode* pos);
void ListInsertAfter(ListNode* pos, DataType x);
void ListEraseAfter(ListNode* pos);